import csv
import re
import pandas as pd


def add_header(header: list, from_path: str, out_path: str):
    """
    为csv文件添加header头
    :param from_path: 源文件路径
    :param out_path: 输出文件路径
    :return:
    """
    with open(from_path, mode="r", encoding="utf-8") as fr:
        read = csv.reader(fr)
        with open(out_path, mode='a', encoding='utf-8', newline="") as f:
            write = csv.writer(f)
            write.writerow(header)
            for row in read:
                write.writerow(row)
    print(f"添加{header}成功")


"""
head( n ) 方法用于读取前面的 n 行，如果不填参数 n ，默认返回 5 行
tail( n ) 方法用于读取尾部的 n 行，如果不填参数 n ，默认返回 5 行，空行各个字段的值返回 NaN。
info() 方法返回表格的一些基本信息：
注意：默认情况下，dropna() 方法返回一个新的 DataFrame，不会修改源数据。
如果你要修改源数据 DataFrame, 可以使用 inplace = True 参数:
df.dropna(
    axis=0, #删除维度，0为行，1为列。默认为0。
    how='any', #删除的判断条件。'any'代表这一行只要有一个空值就删除。'all'表示，这一行都是空值才删除。
    thresh=None, # 例如，thresh=N，即，只要空值大于等于N的都删除，只保留空值小于N的行和列。
    subset=None, # list，对特定的列的缺失值处理。
    inplace=False # 布尔值，是否修改原数据。默认为False。
)

df.drop(
labels=None, #要删除的行或列的标签名。list、str
axis=0, #表示删除的是行还是列。行为0，列为1，默认为0。
index=None, #行索引
columns=None, #列索引
level=None, #删除标签的级别。对于MultiIndex而言的。一般只有一级。
inplace=False, #是有覆盖原数据，默认为False。
errors='raise'#{'ignore'，'raise'}，默认为'raise'，如果'ignore'，则抑制错误，仅删除现有标签 。
)

替换空单元格的常用方法是计算列的均值、中位数值或众数。
Pandas使用 mean()、median() 和 mode() 方法计算列的均值（所有值加起来的平均值）、
中位数值（排序后排在中间的数）和众数（出现频率最高的数）
"""

# header = ['标题', '子标题', '标签', '总播放', '追剧人数', '弹幕数', '长评数', '短评数', '上映时间', '播放时长', '评分',
#           '评分人数']
# add_header(header, from_path="mv_info.csv", out_path="result.csv")

df = pd.read_csv("result.csv", )
df.head()


# 播放时长为空的行删除
df.dropna(subset='播放时长', inplace=True)

# 将评分为 '暂无...' 改为0
df['评分'].replace("暂无评分评分人数不足我要点评", "0", inplace=True)
# print(df['评分'])
df['评分人数'].fillna("0人评", inplace=True)
# print(df['评分人数'])
# res = df.dropna(subset="评分")# 删除'评分'字段为null的


# 长评数、短评数空值替换为0
df['长评数'].fillna(0, inplace=True)
df['短评数'].fillna(0, inplace=True)
# print(df['长评数'])
# print(df['短评数'])

# 标签为空的设置为剧情,子标题为空设置为无子标题
df['标签'].fillna('剧情', inplace=True)
df['子标题'].fillna('无子标题', inplace=True)
# print(df['标签'])

# 删除含有空值的行
# df.dropna(inplace=True)

# 删除上映时间为敬请期待的数据
df.dropna()

# 提取评分人数的数值
pf = df['评分人数'].apply(lambda x: re.findall(r'\d+', str(x))[0])
df['评分人数'] = pf

# 删除重复数据
df.drop_duplicates(inplace=True)


# 保存数据
print("数据清洗成功")
df.to_csv("result_1.csv")
